package com.example.controller;


import com.example.pojo.Dept;
import com.example.pojo.Result;
import com.example.service.DeptService;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

//@RequestMapping("/dept") 提取出公共的请求路径，这里是"/dept"
@RestController
/* 这个注解表示这是一个控制器类,接受http请求，所有的方法都将返回json数据，
           里面包含其他注解，比如@RequestMapping等
           @RestController注解相当于@Controller和@ResponseBody注解的组合，
           即将返回json数据，同时也会将方法的返回值直接转换为json数据。
 */
public class DeptController {

    // 日志记录器,也可以在类上面使用@Slf4j注解（属于Lombok）来自动生成日志记录器
    private static final Logger LOGGER = LoggerFactory.getLogger(DeptController.class);

    //@Resource(name = "deptServiceImpl")
    @Autowired
    private DeptService deptService;

    // 这个注解表示访问这个方法的url为"/depts"，返回json数据,
    // 同时将请求方式设置为GET
    //@RequestMapping(value = "/depts",method = RequestMethod.GET)
    @GetMapping("/depts")  // @GetMapping注解是@RequestMapping的GET方式的简写
    public Result list(){
        //System.out.println("查询所有部门信息");
        LOGGER.info("查询所有部门信息");
        List<Dept> deptList = deptService.findAll();
        return Result.success(deptList);
    }

    @DeleteMapping("/depts")
    // @RequestParam注解用于获取请求参数
    // 使用@RequestParam时，必须指定参数名，否则会报错
    // 若不想传递参数，可以将@RequestParam的require属性设为false，表示可选参数
    // 若参数名与方法参数名不一致，可以用@RequestParam注解的value属性指定参数名
    // 当形参与请求参数名一致时，可以省略@RequestParam注解
    public Result delete(@RequestParam("id") Integer id){  // 这里的id参数名与方法参数名一致，可以省略@RequestParam注解
        //System.out.println("删除" + id + "号部门信息");
        LOGGER.info("删除{}号部门信息", id); // 使用占位符{}来代替参数值
        deptService.deleteById(id);
        return Result.success("success");
    }

    @PostMapping("/depts")  // @PostMapping注解是@RequestMapping的POST方式的简写,POST方式约定用于新增数据
    // @RequestBody注解用于将请求体中的json数据绑定到pojo对象中
    public Result add(@RequestBody Dept dept) {
        //System.out.println("新增部门信息：" + dept.toString());
        LOGGER.info("新增部门信息：" + dept.toString());
        deptService.insert(dept);
        return Result.success("success");
    }

    @GetMapping("/depts/{id}")
    // @PathVariable注解用于获取路径参数
    // 路径参数的值将被自动绑定到方法参数中
    // 当路径参数与方法参数名不一致时，可以用@PathVariable注解的value属性指定参数名
    // 当路径参数与请求参数名一致时，可以省略@PathVariable的value属性
    public Result search(@PathVariable("id") Integer id) {
        //System.out.println("查询" + id + "号部门信息");
        LOGGER.info("查询" + id + "号部门信息");  //使用字符串拼接
        Dept dept = deptService.findById(id);
        return Result.success(dept);
    }

    @PutMapping("/depts")
    public Result update(@RequestBody Dept dept){
        //System.out.println("更新" + dept.getId() + "号部门信息：" + dept.toString());
        LOGGER.info("更新" + dept.getId() + "号部门信息：" + dept.toString());
        deptService.update(dept);
        return Result.success(deptService.findById(dept.getId()));
    }
}
